package com.yuw.dz;

public class TestDriver {
    public static void main(String[] args) {
        test01();
        System.out.println("=================================================================");
        test02();
        System.out.println("=================================================================");
        test03();
        System.out.println("===========================自增自减运算======================================");
        test04();
        System.out.println("=================================================================");
        test05();
        System.out.println("=================================================================");
        test06();
        System.out.println("=================================================================");
        test07();
    }
    // 子方法

    /**
     * 条件表达式：嵌套形式(可以if-else分支语句进行替换)
     * 根据成绩判定成绩等级
     */
    private static void test07() {
        // 成绩
        int score = 95;
        // 条件表达式
        String strGrade = score >= 90 ? "优秀" :
                score >= 80 ? "良好" :
                        score >= 70 ? "中等" :
                                score >= 60 ? "及格" : "不及格";
        // 输出结果
        System.out.println("你的成绩是：" + score + ";成绩等级是：" + strGrade);
    }

    /**
     * 条件表达式
     */
    private static void test06() {
        // 年龄变量
        int age = 18;
        // 条件表达式
        String strResult = age >= 18 ? "成年人" : "未成年人";
        // 两个结果表达式之间兼容也可以
        double strResult2 = age >= 18 ? 10 : 11.0;
        System.out.println("根据年龄判定你是：" + strResult);
    }

    /**
     * 使用自增、自减运算验证逻辑短路
     */
    private static void test05() {
        // 定义变量
        int i0 = 0;
        int i1 = 1;
        int i2 = 2;
        int i3 = 3;
        int i4 = 4;
        int i5 = 5;
        System.out.println("各个变量的初始值：");
        System.out.println("i0=" + i0 + ";i1=" + i1 + ";i2=" + i2 + ";i3=" + i3 + ";i4=" + i4 + ";i5=" + i5);

        // 逻辑或短路
        //                 false   ||     true     ||    true
        // 表达式结果： 0  >   2   ||   3   >=  3  ||  4   <  6
        // 变量的结果： 1      2        3       4      5      6
        boolean isR0 = i0++ > ++i1 || ++i2 >= i3++ || i4++ < ++i5;
        //                             短路发生地        第三个表达式不会被编译器运算
        // i0>i1
        System.out.println("逻辑或短路发生之后，各个变量的值：");
        System.out.println("i0=" + i0 + ";i1=" + i1 + ";i2=" + i2 + ";i3=" + i3 + ";i4=" + i4 + ";i5=" + i5);
    }

    /**
     * 自增、自减运算：★★★★
     */
    private static void test04() {
        // 定义一个变量
        int i0 = 0;// 初始值
        System.out.println("先增运算之前的变量 i0 的值：" + i0);
        // 自增运算：先增运算（操作符++在变量i0之前）
        int j0 = ++i0; // 解析： ++i0 是一个先增运算表达式  含有两种值： 表达式 ++i0的值   ； 变量i0自身的值
        // 自增运算表达式 ++i0 运算结果的值 存在了 变量 j0 中
        System.out.println("先增运算表达式 ++i0 的值：" + j0);
        System.out.println("先增运算之后的变量 i0 的值：" + i0);
        System.out.println("------------------------------------------------");
        // 定义一个变量
        int i1 = 0;// 初始值
        System.out.println("后增运算之前的变量 i1 的值：" + i1);
        // 自增运算：后增运算（操作符++在变量i0之后）
        int j1 = i1++; // 解析：  是一个后增运算表达式  含有两种值： 表达式 i1++的值   ； 变量i1自身的值
        // 自增运算表达式 i1++ 运算结果的值 存在了 变量 j1 中
        System.out.println("后增运算表达式 i1++ 的值：" + j1);
        System.out.println("后增运算之后的变量 i1 的值：" + i1);

        // 课堂作业：参照上面代码，编写 先减、后减运算的代码。
    }

    /**
     * 赋值运算
     */
    private static void test03() {
        // +=
        int iVal0 = 0;
        int iVal1 = 1;

        // int iVal10 +=2;
        iVal0 += 2;

        System.out.println("iVal0=" + iVal0);

        byte bVal0 = 0;
        //bVal0 = bVal0 + 1;  // 右侧表达式结果类型为 int
        bVal0 += 1; // 为什么可以呢？【课下作业】
        System.out.println("bVal0=" + bVal0);
    }

    /**
     * 逻辑运算：进行逻辑判定的运算
     */
    private static void test02() {
        // ! && ||
        int iVal0 = 0;
        int iVal1 = 1;
        int iVal2 = 2;
        int iVal3 = 3;
        int iVal4 = 4;
        // !
        boolean isR0 = !(iVal0 > iVal1); // iVal0>iVal1 = false   !false = true
        // &&
        boolean isR1 = iVal0 > iVal1 && iVal2 < iVal3; // false &&  ===> false  短路现象
        // ||
        boolean isR2 = iVal0 < iVal1 || iVal2 < iVal3; // true ||   ===> true  短路现象

        System.out.println("isR0=" + isR0 + ";isR1=" + isR1 + ";isR2=" + isR2);
        // 短路
        boolean isR3 = iVal0 < iVal1 || iVal2 < iVal3 || iVal3 < iVal4; // true ||   ===> true  短路现象
        System.out.println("isR3=" + isR3);
    }

    /**
     * 位运算：按操作数的二进制位进行运算
     */
    private static void test01() {
        // ~ & | ^ << >> >>>
        int iVal0 = 2;  // 0000 0010
        int iVal1 = 3;  // 0000 0011
        // 取反运算
        int iVal00 = ~iVal0; // 0000 0010 取反  1111 1101 （此时的数是补码形式，转换为原码就是-3）
        System.out.println("iVal00=" + iVal00);
        // 位与
        int iVal10 = iVal0 & iVal1;
        // 位或
        int iVal11 = iVal0 | iVal1;
        // 位异或
        int iVal12 = iVal0 ^ iVal1;

        System.out.println("iVal10=" + iVal10 + ";iVal11=" + iVal11 + ";iVal12=" + iVal12);

        // 课堂作业：如果是 -2 和 -3 进行上述运算的话，结果是多少呢？
        // 提示：-2和-3的在计算机中的二进制表示形式是补码；

        // 左移
        int iVal20 = iVal0 << 2; // 等价于iVal0 * 2的2次方 即：等价于 2*4
        System.out.println("iVal20=" + iVal20);

        int iVal3 = -2;
        int iVal21 = iVal3 << 2; // 等价于iVal3 * 2的2次方 即：等价于 -2*4
        System.out.println("iVal21=" + iVal21);

        // 不带符号右移
        int iVal4 = 64;
        // 检验负数
        iVal4 = iVal4 * -1;
        int iVal30 = iVal4 >> 2; // 等价于iVal4 除以 2的2次方 即：等价于 64/4
        System.out.println("iVal30=" + iVal30);

        // 带符号右移
        int iVal5 = 64;
        int iVal40 = iVal5 >>> 2; // 等价于iVal5 除以 2的2次方 即：等价于 64/4
        System.out.println("iVal40=" + iVal40);

        // 比较运算

        boolean isbig = iVal0 > iVal1;
        System.out.println("isbig=" + isbig);
    }
}
